package cc.rengu.igas.bomp.common.util;

import cc.rengu.oltp.utility.util.StringUtil;
import cc.rengu.utility.log.RgLog;
import cc.rengu.utility.log.RgLogger;
import net.coobird.thumbnailator.Thumbnails;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;

public class ImageHandleUtil {


    /**
     * 根据指定大小和指定精度压缩图片
     *
     * @param srcPath     源图片地址
     * @param desPath     目标图片地址
     * @param desFileSize 指定图片大小，单位kb
     * @param accuracy    精度，递归压缩的比率，建议小于0.9
     */
    public static void commpressPicForScale(String srcPath, String desPath,
                                            long desFileSize, double accuracy) throws IOException {
        // Log log = new Log4JLogger();
        RgLogger rglog = RgLog.getLogger(ImageHandleUtil.class.getName());
        if (StringUtil.isEmptyOrNull(srcPath)) {
            return;
        }
        if (!new File(srcPath).exists()) {
            return;
        }

        File srcFile = new File(srcPath);
        long srcFileSize = srcFile.length();
        if (srcFileSize <= desFileSize * 1024) {
            rglog.debug("源图片：" + srcPath + "，大小：" + srcFileSize / 1024 + "kb" + "不需要压缩");
            return;
        }
        rglog.debug("源图片：" + srcPath + "，大小：" + srcFileSize / 1024 + "kb");
        // 1、先转换成jpg
        Thumbnails.of(srcPath).scale(1f).toFile(desPath);
        // 递归压缩，直到目标文件大小小于desFileSize
        commpressPicCycle(desPath, desFileSize, accuracy);

        File desFile = new File(desPath);
        rglog.debug("目标图片：" + desPath + "，大小" + desFile.length() / 1024 + "kb" + "图片压缩完成！");

    }

    private static void commpressPicCycle(String desPath, long desFileSize,
                                          double accuracy) throws IOException {
        File srcFileJPG = new File(desPath);
        long srcFileSizeJPG = srcFileJPG.length();
        // 2、判断大小，如果小于500kb，不压缩；如果大于等于500kb，压缩
        if (srcFileSizeJPG <= desFileSize * 1024) {
            return;
        }
        // 计算宽高
        BufferedImage bim = ImageIO.read(srcFileJPG);
        int srcWdith = bim.getWidth();
        int srcHeigth = bim.getHeight();
        int desWidth = new BigDecimal(srcWdith).multiply(
                new BigDecimal(accuracy)).intValue();
        int desHeight = new BigDecimal(srcHeigth).multiply(
                new BigDecimal(accuracy)).intValue();

        Thumbnails.of(desPath).size(desWidth, desHeight)
                .outputQuality(accuracy).toFile(desPath);
        commpressPicCycle(desPath, desFileSize, accuracy);
    }
}
